package com.eliza.kotlin.design.creation.single

import com.eliza.ktor.all.library.utils.ToolsLog


/*-*- coding:utf-8 -*-
 * @Author  : debi
 * @Time    : 6/4/22
 * @Software: IntelliJ IDEA
 */
/**
 * 当调用getInstance()方法获取Singleton类的对象的时候才创建Singleton类的对象，这样就实现了懒加载的效果。
 * 但是，如果是多线程环境，会出现线程安全问题。
 * */
/*
* 懒汉式： 静态成员变量
*/
private class LazySingleton {

    //1，私有构造方法
    private constructor()


    companion object {
        /*init方法最终被编译成了static代码块*/

        //2，在本类中创建本类对象
        private var instance: LazySingleton? = null

        //3，提供一个公共的访问方式，让外界获取该对象

        /**
         * 不加 Synchronized
         * 当调用getInstance()方法获取Singleton类的对象的时候才创建Singleton类的对象，
         *      这样就实现了懒加载的效果。但是，如果是多线程环境，会出现线程安全问题。
         * */


        /**
         * 在getInstance()方法上添加了synchronized关键字，导致该方法的执行效果特别低
         * 就是在初始化instance的时候才会出现线程安全问题，一旦初始化完成就不存在了。
         * */
        @Synchronized
        fun getInstance(): LazySingleton {
            //判断instance是否为null，如果为null，说明还没有创建Singleton类的对象
            //如果没有，创建一个并返回，如果有，直接返回
            if (instance == null) {
                //线程1等待，线程2获取到cpu的执行权，也会进入到该判断里面

                instance = LazySingleton()
            }

            return instance!!
        }
    }


}

fun main() {

    //创建Singletion类的对象
    val instance = LazySingleton.getInstance()

    val instance1 = LazySingleton.getInstance()
    //判断获取到的两个是否是同一个对象
    ToolsLog.LogPrintln(instance === instance1, 14)
}